"""
metrics_config.py
-----------------
定义训练与验证阶段的评价指标配置，包括：
- 分类任务指标（accuracy、precision、recall、f1、auc 等）
- 回归任务指标（mse、mae、r2 等）
- 分割任务指标（dice、iou 等）
- 可以自定义指标函数
- 文件末尾包含测试代码
"""

from dataclasses import dataclass, field
from typing import List, Callable, Optional, Dict

@dataclass
class MetricsConfig:
    # === 指标列表 ===
    metrics: List[str] = field(default_factory=lambda: ["accuracy"])
    """
    可选指标：
    分类: accuracy, precision, recall, f1, auc
    回归: mse, mae, r2
    分割: dice, iou
    """

    # === 自定义指标 ===
    custom_metrics: Optional[Dict[str, Callable]] = field(default_factory=dict)
    """
    用户可以传入字典形式的自定义指标函数：
        custom_metrics = {
            "my_metric": lambda pred, target: ...,
        }
    """

    def summary(self):
        """打印指标配置"""
        print("📊 指标配置")
        print(f"  内置指标: {self.metrics}")
        if self.custom_metrics:
            print(f"  自定义指标: {list(self.custom_metrics.keys())}")
        else:
            print(f"  自定义指标: None")


# -----------------------------
# 测试代码
# -----------------------------
if __name__ == "__main__":
    print("=== 测试 MetricsConfig ===")

    # 默认分类指标
    default_config = MetricsConfig()
    default_config.summary()

    print("\n=== 自定义指标配置示例 ===")
    # 自定义指标示例
    def custom_mse(pred, target):
        return ((pred - target)**2).mean()

    custom_config = MetricsConfig(
        metrics=["accuracy", "f1"],
        custom_metrics={"custom_mse": custom_mse}
    )
    custom_config.summary()

    # 测试调用自定义指标
    import torch
    pred = torch.tensor([0.2, 0.8, 0.6])
    target = torch.tensor([0.0, 1.0, 1.0])
    print("自定义指标计算结果:", custom_config.custom_metrics["custom_mse"](pred, target).item())
